/**
 * 
 */
package br.com.skynix.tcmc.model.rh;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;

import br.com.skynix.tcmc.base.model.EntidadeAuditavel;
import br.com.skynix.tcmc.model.enumeration.UnidadeFederativaEnum;

/**
 * @author davi
 * 
 */
@Entity
@Table(name = "tb_empresa")
public class Empresa extends EntidadeAuditavel {
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_empresa_fk", nullable = true,
			referencedColumnName = "id")
	@ForeignKey(name = "FK001_empresa")
	private Empresa empresa;

	@NotNull
	@Size(min = 3, max = 255)
	@Column(name = "nome_fantasia", nullable = false, length = 255)
	private String nomeFantasia;

	@Size(max = 255)
	@Column(name = "razao_social", nullable = true, length = 255)
	private String razaoSocial;

	@NotNull
	@Size(max = 20)
	@Column(nullable = false, length = 20)
	private String cnpj;

	@Size(max = 20)
	@Column(name = "inscricao_estadual", nullable = true, length = 20)
	private String inscricaoEstadual;

	@Size(max = 20)
	@Column(name = "inscricao_municipal", nullable = true, length = 20)
	private String inscricaoMunicipal;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String endereco;

	@Size(max = 5)
	@Column(nullable = true, length = 5)
	private String numero;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String bairro;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String cidade;

	@Column(nullable = true, length = 2,
			columnDefinition = "CHAR(2) DEFAULT NULL")
	@Enumerated(EnumType.STRING)
	private UnidadeFederativaEnum estado;

	@Size(max = 15)
	@Column(nullable = true, length = 15)
	private String cep;

	@Size(max = 255)
	@Column(nullable = true, length = 255)
	private String complemento;

	@Column(nullable = true, columnDefinition = "TEXT DEFAULT NULL")
	private String observacao;

	@NotNull
	@Column(name = "flag_matriz", nullable = false,
			columnDefinition = "BOOLEAN DEFAULT FALSE")
	private Boolean flagMatriz;

	@ManyToMany(mappedBy = "empresas", fetch = FetchType.LAZY)
	@ForeignKey(name = "FK001_empresa_x_funcionario")
	private Set<Funcionario> funcionarios;

	/**
	 * @return the empresa
	 */
	public Empresa getEmpresa() {
		return empresa;
	}

	/**
	 * @param empresa the empresa to set
	 */
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	/**
	 * @return the nomeFantasia
	 */
	public String getNomeFantasia() {
		return nomeFantasia;
	}

	/**
	 * @param nomeFantasia the nomeFantasia to set
	 */
	public void setNomeFantasia(String nomeFantasia) {
		this.nomeFantasia = nomeFantasia;
	}

	/**
	 * @return the razaoSocial
	 */
	public String getRazaoSocial() {
		return razaoSocial;
	}

	/**
	 * @param razaoSocial the razaoSocial to set
	 */
	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}

	/**
	 * @return the cnpj
	 */
	public String getCnpj() {
		return cnpj;
	}

	/**
	 * @param cnpj the cnpj to set
	 */
	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	/**
	 * @return the inscricaoEstadual
	 */
	public String getInscricaoEstadual() {
		return inscricaoEstadual;
	}

	/**
	 * @param inscricaoEstadual the inscricaoEstadual to set
	 */
	public void setInscricaoEstadual(String inscricaoEstadual) {
		this.inscricaoEstadual = inscricaoEstadual;
	}

	/**
	 * @return the inscricaoMunicipal
	 */
	public String getInscricaoMunicipal() {
		return inscricaoMunicipal;
	}

	/**
	 * @param inscricaoMunicipal the inscricaoMunicipal to set
	 */
	public void setInscricaoMunicipal(String inscricaoMunicipal) {
		this.inscricaoMunicipal = inscricaoMunicipal;
	}

	/**
	 * @return the endereco
	 */
	public String getEndereco() {
		return endereco;
	}

	/**
	 * @param endereco the endereco to set
	 */
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	/**
	 * @return the numero
	 */
	public String getNumero() {
		return numero;
	}

	/**
	 * @param numero the numero to set
	 */
	public void setNumero(String numero) {
		this.numero = numero;
	}

	/**
	 * @return the bairro
	 */
	public String getBairro() {
		return bairro;
	}

	/**
	 * @param bairro the bairro to set
	 */
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	/**
	 * @return the cidade
	 */
	public String getCidade() {
		return cidade;
	}

	/**
	 * @param cidade the cidade to set
	 */
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	/**
	 * @return the estado
	 */
	public UnidadeFederativaEnum getEstado() {
		return estado;
	}

	/**
	 * @param estado the estado to set
	 */
	public void setEstado(UnidadeFederativaEnum estado) {
		this.estado = estado;
	}

	/**
	 * @return the cep
	 */
	public String getCep() {
		return cep;
	}

	/**
	 * @param cep the cep to set
	 */
	public void setCep(String cep) {
		this.cep = cep;
	}

	/**
	 * @return the complemento
	 */
	public String getComplemento() {
		return complemento;
	}

	/**
	 * @param complemento the complemento to set
	 */
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}

	/**
	 * @return the observacao
	 */
	public String getObservacao() {
		return observacao;
	}

	/**
	 * @param observacao the observacao to set
	 */
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	/**
	 * @return the flagMatriz
	 */
	public Boolean getFlagMatriz() {
		return flagMatriz;
	}

	/**
	 * @param flagMatriz the flagMatriz to set
	 */
	public void setFlagMatriz(Boolean flagMatriz) {
		this.flagMatriz = flagMatriz;
	}

	/**
	 * @return the funcionarios
	 */
	public Set<Funcionario> getFuncionarios() {
		return funcionarios;
	}

	/**
	 * @param funcionarios the funcionarios to set
	 */
	public void setFuncionarios(Set<Funcionario> funcionarios) {
		this.funcionarios = funcionarios;
	}
}
